    
    /*
     * Basic tests to ensure that core extensions are applied uniformly accross
     * browsers.
     * 
     * @author David Foley
     */
    TestCase
    (
        'ie.ondevice.objectkit.FunctionExtensionsAppliedTestCase'

    ,   {
            testIsExtensionApplied: function () 
            {
                assertNotNull('A Function.prototype.is property is defined', Function.prototype.is);
                assertInstanceOf('The Function.prototype.is method is defined', Function, Function.prototype.is);
            }
            
        ,   testBindExtensionApplied: function () 
            {
                assertNotNull('A Function.prototype.bind property is defined', Function.prototype.bind);
                assertInstanceOf('The Function.prototype.bind method is defined', Function, Function.prototype.bind);
            }   
            
        ,   testImplementExtensionApplied: function () 
            {
                assertNotNull('A Function.prototype.implement property is defined', Function.prototype.implement);
                assertInstanceOf('The Function.prototype.implement method is defined', Function, Function.prototype.implement);
            }
            
        ,   testImplementStaticExtensionApplied: function () 
            {
                assertNotNull('A Function.prototype.implementStatic property is defined', Function.prototype.implementStatic);
                assertInstanceOf('The Function.prototype.implementStatic method is defined', Function, Function.prototype.implementStatic);
            }
            
        ,   testImplementPreventOverrideExtensionApplied: function () 
            {
                assertNotNull('A Function.prototype.implement.preventOverride property is defined', Function.prototype.implement.preventOverride);
                assertInstanceOf('The Function.prototype.implement.preventOverride value is defined', Boolean, Function.prototype.implement.preventOverride);
            }
            
        ,   testInheritExtensionApplied: function () 
            {
                assertNotNull('A Function.prototype.inherit property is defined', Function.prototype.inherit);
                assertInstanceOf('The Function.prototype.inherit method is defined', Function, Function.prototype.inherit);
            }
            
        ,   testGetNameExtensionApplied: function () 
            {
                assertNotNull('A Function.prototype.getName property is defined', Function.prototype.getName);
                assertInstanceOf('The Function.prototype.getName method is defined', Function, Function.prototype.getName);
            }
            
            /**
             * In general, while host objects may appear to have the same
             * nature as native and custom objects, you should generally not
             * expect ObjectKit extensions to work with them.
             */
        ,   testExtensionsNotAppliedToHostObjects: function () 
            {
                if (window.opera) // Opera actually WILL fulfil!
                {
                    return;
                }
                
                // A HTMLParagraphElement
                var HostObject= document.createElement('p').constructor
                ,   trait= {}
                
                // add a temp variable to Function.prototype. This is the same
                // technique used to extend Custom and Native objects
                Function.prototype.__TEMP= trait;
                
                // The __TEMP trait should be available on all constructors
                assertSame('The temp object was added to native objects', trait, String.__TEMP);
                
                // but host object constructors are NOT the same as functions
                // and are typically shims
                assertUndefined('The temp object was not added to the host object', HostObject.__TEMP);
                
                delete Function.prototype.__TEMP;
            }
        }
    );